/**
 * 用户登录、退出
 * @type {{processLogin: processLogin, logout: logout}}
 */

(function () {
  var AuthController = {};
  var root = this;

  /**
   * 用户登录提交请求校验
   * @param next next(err). err,返回错误。成功，不返回任何信息。
   * @returns {*}
   */
  function validateLogin(next) {
    if (!_.has(request, "username") || !_.has(request, "password")) {
      return next("用户名或密码都是不能为空!");
    }

    return next();
  }

  /**
   * 查询用户信息
   * @param next next(err, result). err,返回错误, result,返回用户信息
   * @returns {*}
   */
  function findOneUser(next) {

    User.findOne({username: request.username}).exec(function (err, result) {
      if (err) {
        sails.log.error(err);
        return next(err);
      }

      return next(null, result);
    });

  };

  /**
   * 查询激活用户
   * @param user
   * @param next next(err, result). err,返回错误, result,返回激活用户信息
   */
  function findActiveUser(next) {

    var query = {"username": request.username, "validateCode": request.password};
    ActiveUser.findOne(query).exec(function (err, result) {
      if (err) {
        sails.log.error(err);
        return next(err);
      }
      return next(null, result);
    });

  };

  /**
   * 删除激活数据
   * @param next next(err, result). err,返回错误, result,返回用户信息
   */
  function destroyActiveUser(activeUser, user, next) {
    ActiveUser.destroy({id: activeUser.id})
      .exec(function (err, result) {
        if (err) {
          sails.log.error(err);
          return next(err);
        }
        return next(null, user);
      });
  };

  /**
   * 根据激活用户，创建用户
   * @param activeUser
   * @param next next(err, result). err,返回错误, result,返回用户信息
   */
  function createUser(activeUser, next) {

    var user = _.clone(request);
    user.type = activeUser.type;

    User.create(user).exec(function (err, result) {
      if (err) {
        return next(err);
      }

      return next(null, activeUser, result);
    });
  };

  /**
   * 根据激活用户，更新用户
   * @param activeUser
   * @param next next(err, activeUser, user). err,返回错误, activeUser,返回激活用户信息, user,返回用户信息
   */
  function updateUser(activeUser, next) {

    var newValues = _.clone(request);
    newValues.type = activeUser.type;

    User.update({username: request.username}, newValues).exec(function (err, results) {
      if (err) {
        return next(err);
      }

      var result = results[0];
      if (_.has(result, 'id')) {
        return next(null, activeUser, result);
      } else {
        return next("用户更新失败");
      }

    });

  };

  /**
   * 激活用户
   * @param user
   * @param next  next(err, result). err,返回错误, result,返回用户信息
   * @returns {*}
   */
  function activeUser(next, results) {

    var user = results['user'];
    var activeUser = results['activeUser'];

    if (user == null && activeUser == null) {
      return next(null, '用户不存在');


    } else if (user == null && activeUser != null) {//如果用户不存在但有激活用户，新建用户
      async.waterfall([
        async.apply(createUser, activeUser),
        destroyActiveUser
      ], function (err, result) {
        if (err) {
          return next(err);
        } else {
          return next(null, result);
        }
      });

    } else if (user != null && activeUser == null) { //如果用户存在但无激活用户，校验用户登录。
      if (user.validPassword(request.password)) {
        return next(null, user);
      } else {
        return next('密码错误')
      }

    } else if (user != null && activeUser != null) { //如果用户存在但有激活用户，更新用户密码
      async.waterfall([
        async.apply(updateUser, activeUser),
        destroyActiveUser
      ], function (err, result) {
        if (err) {
          return next(err);
        } else {
          return next(null, result);
        }
      });
    }

  }

  /**
   * 创建用户登录临时令牌，有效期2分钟。
   * @param user
   * @param next next(err, result). err,返回错误, result,返回用户登录临时令牌
   */
  function createUserToken(user, next) {

  }

  /**
   * 用户登录
   * @param req
   * @param res
   */
  AuthController.processLogin = function (req, res) {
    root.request = req.body;

    async.auto({
      validate: validateLogin,
      user: ['validate', findOneUser],
      activeUser: ['validate', findActiveUser],
      active: ['user', 'activeUser', activeUser]
    }, function (err, results) {
      if (err) {
        return res.jsonResponse(400, err);
      }

      var result = results['active'];
      if (_.has(result, 'id')) {
        req.session.authenticated = true;
        req.session.user = result;
        res.jsonResponse(200, '登录成功!');
      } else {
        res.jsonResponse(400, '登录失败!');
      }

    });
  };

  /**
   * 用户退出
   * @param req
   * @param res
   */
  AuthController.logout = function (req, res) {

    if (req.session.authenticated) {
      req.session.authenticated = false;
      req.session.user = null;
    }

    res.jsonResponse(200, '登出成功!');
  };

  /**
   * 获取临时的用户登录令牌，为手机APP等第三方应用使用登录时方便使用。
   * 有效时间为2分钟。
   * @param req
   * @param res
   */
  AuthController.userToken = function (req, res) {
    root.request = req.body;

    async.auto({
      validate: validateLogin,
      user: ['validate', findOneUser],
      activeUser: ['validate', findActiveUser],
      active: ['user', 'activeUser', activeUser],
      token: ['active', createUserToken]
    }, function (err, results) {
      if (err) {
        return res.jsonResponse(400, err);
      }

      var result = results['active'];
      if (_.has(result, 'id')) {
        res.jsonResponse(200, '登录成功!');
      } else {
        res.jsonResponse(400, '登录失败!');
      }

    });
  };

  /**
   * 第三方应用使用userToken登录
   * @param req
   * @param res
   */
  AuthController.loginByUserToken = function (req, res) {
    root.request = req.body;


  };

  module.exports = AuthController;
}())